package com.cn.gz.liwy.datatype;


import com.cn.gz.liwy.constan.StaticFinal;

/**
 * int 常用于常规计数 32位2进制数 最高位为符号位
 * 是Java 提供的4种整型 中最常被开发者使用的一种
 * 具体特性见 本类成员变量int32和
 */
public class MyInt extends DataTypeBase implements DataType{

    /**
     * 当int类型是A类的成员变量时，A类初始时会将其置为默认值0,其他情况声明时可以不给初始值，但是使用前必须赋值；
     * 无法置为null，因为 null实际是特殊的类，int不是类，所以不能赋值；
     */
    private int int32 ;


    /** int 类型 对应的包装类是 Integer,和所有java对象一样，未初始时 默认值是null ,
     * 提供了很多操作 int 的方法
     * 详见api (https://docs.oracle.com/javase/8/docs/api/ -->java.lang.Integer -->Method Summary
     * */
    private Integer integer;

    /**
     * 此处 override 覆盖了 父类的无参构造器
     */
    public MyInt(){
//        typeName = "int";
        setTypeName("int");
        setTypeSize(size());
        setTypeValueRange(valueRange());
        // int转换为字符串  方法1
        setTypeDefaultVal(defaultValue());
        setTypePacketClass(packetClass());
        new MyInt(this);
        out("============"+getTypeName()+"类型使用规则"+"============");
        commonlyUsed();
        illegalUsed();
        out("==================华丽丽的分割线==================");
    }

    /**
     * 此处 override 覆盖了 父类的无参构造器
     */
    public MyInt (MyInt myInt){
//        将初始好的子类以参数的形式传到父类有参构造
        super(myInt);
    }


    @Override
    public int size() {
        return Integer.SIZE;
    }

    @Override
    public String valueRange() {
        // int转换为字符串 方法2
        return  Integer.MIN_VALUE+"~"+Integer.MAX_VALUE;
    }


    @Override
    public String defaultValue() {
        return Integer.toString(int32);
    }

    /**
     * int 用常用于 for循环计数
     */
    @Override
    public void commonlyUsed() {
        out(StaticFinal.RIGHT+"int类型用常用于for循环计数，下例中，i表示循环总次数，j表示第几次循环");
        int i = 3;
        for (int j=1 ; j<=i ; j++){
            out("[i---->"+i+"]:j---->"+j);
        }
    }

    @Override
    public void illegalUsed() {
        out(StaticFinal.ERROR+"int类型无法置为null，声明时可以不赋值， 使用前必须初始，否则无法通过编译");
        // [证伪语句] 解除注释后，可查看报错
        // 无法置为 null
//         int unableNull = null;
        // [证伪语句] 使用前必须初始，否则无法通过编译
        int i=10;
//        for (int k; k<i ; k++){
//            out("[i---->j]:"+i+"---->"+k);
//        }
    }

    @Override
    public String packetClass() {
        return ""+Integer.class;
    }
}
